package com.wgy.day41JDBC.练习;

import com.wgy.day41JDBC.抽取JDBC工具类.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

/*
5.PreparedStatement:执行sql对象
   1.sql注入问题: 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
                  1.输入用户名随便,密码:a' or 'a' = 'a
                  2.sql: select * from user where username='fnaaf' and password='a' or 'a' = 'a'
   2.解决sql注入问题:使用PreparedStatement对象来解决
   3.预编译的sql:参数使用?作为占位符
   4.步骤:
           1.导入驱动jar包
           2.注册驱动
           3.获取数据库连接对象connection
           4.定义sql sql的参数使用?作为占位符
               比如: select * from user where username=? and password= ? ;
           5.获取执行sql语句的对象PreparedStatement
               方法: connection.preparedStatement(String sql):
           6.给?赋值
               方法:preparedStatement.setXxx(参数1,参数2):
                    参数1:?号的位置 从1开始
                    参数2:?号对应的值
            7.执行sql,接收返回结果,不需要传递sql语句
            8.处理结果
            9.释放资源
       注意:后期都是使用PreparedStatement对象来执行sql语句
            1.可以防止sql注入问题
            2.效率更高
 */
public class Demo11JDBC {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您的用户名");
        String name = sc.nextLine();
        System.out.println("请输入您的密码");
        String password = sc.nextLine();
        boolean b = new Demo11JDBC().login(name, password);
        if(b){
            System.out.println("登录成功!");
        }else{
            System.out.println("用户名或密码错误!");}
    }

     //定义一个登录的方法,使用PreparedStatement来实现
    public  boolean login(String username, String password) {
        if(username==null || password==null){
            return false;
        }
        // 连接数据库.判断是否登录成功
        Connection conn=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;

        try {//1.导入驱动jar包
            //1.获取连接对象
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "select * from user where username= ? and password= ? ";
            //3.获取执行Sql的对象
           pstmt = conn.prepareStatement(sql);
           //4.给?号赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //5.执行查询语句
            rs = pstmt.executeQuery();
            //6.判断,如果下一行存在数据 则返回true,不存在数据 则返回false
            return rs.next();

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally{
            //7.释放资源
            JDBCUtils.close(rs,pstmt,conn);
        }
        return false;
    }
}
